//! 用户模组
//! 
//! 用户模组用于定义一些用户交互过程必要的数据结构和枚举类型
#![allow(unused_imports)]
use crate::utils::QuickHashExt;
use crate::order::Direction;
use super::DataTransferObject;
use chrono::Utc;
use serde::{Deserialize, Serialize};
use bytes::Bytes;
use anyhow::Result;
use log;

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, DataTransferObject)]
pub struct Authority {
    pub client_id: Option<u64>, // 用户ID(哈希, 可通过该标识重新连接)
    // TODO: 添加其他鉴权相关功能
}

impl Authority {
    pub fn generate(&mut self) -> Result<()> {
        // 生成唯一的订单ID和Timestamp
        // 这里简单返回一个随机数作为示例
        let time_us_now = Utc::now().timestamp_micros();
        if self.client_id.is_some() {
            if self.client_id.unwrap() == 0 {
                tracing::warn!("用户ID为0, 需确认为Maker");
            }
            tracing::warn!("Authority already has a client_id, skipping generation");
            return Ok(());
        }
        let hash = format!("user{}", time_us_now).gen_hash();
        self.client_id = Some(hash);
        Ok(())
    }
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, DataTransferObject)]
pub struct Position {
    pub symbol: String,    // 品种
    pub side: Direction,   // 方向 (多/空)
    pub cost: f64,        // 平均价格(成本)
    pub quantity: u64,     // 数量
    pub liquidatable: u64, // 可平仓数量
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, DataTransferObject)]
pub struct Portfolio {
    pub client_id: u64, // 用户ID(哈希, 可通过该标识重新连接)
    pub positions: Vec<Position>, // 持仓列表
    pub balance_cent: i64,        // 账户余额(单位: 分)
    pub balance_available: i64,   // 可用余额(单位: 分)
}